package com.nancal.activiti.controller.editor;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.nancal.activiti.utils.BpmnConverterUtil;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Map;

/**
 * 流程信息入库
 */
@RestController
@RequestMapping("service")
public class ModelSaveRestResource implements ModelDataJsonConstants {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private ObjectMapper objectMapper;

    protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class);

    /**
     * 保存流程
     *
     * @param modelId     模型ID
     * @param name        流程模型名称
     * @param description
     * @param json_xml    流程文件
     * @param svg_xml     图片
     */
    @ResponseStatus(value = HttpStatus.OK)
    @RequestMapping(value = "/model/{modelId}/save", method = RequestMethod.PUT)
    public void saveModel(@PathVariable String modelId
            , String name, String description
            , String json_xml, String svg_xml) {
        try {

            Model model = repositoryService.getModel(modelId);

            ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());

            modelJson.put(MODEL_NAME, name);
            modelJson.put(MODEL_DESCRIPTION, description);
            model.setMetaInfo(modelJson.toString());
            model.setName(name);
            repositoryService.saveModel(model);

            repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));

            InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));
            TranscoderInput input = new TranscoderInput(svgStream);

            PNGTranscoder transcoder = new PNGTranscoder();
            // Setup output
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            TranscoderOutput output = new TranscoderOutput(outStream);

            // Do the transformation
            transcoder.transcode(input, output);
            final byte[] result = outStream.toByteArray();
            repositoryService.addModelEditorSourceExtra(model.getId(), result);
            outStream.close();
        } catch (Exception e) {
            LOGGER.error("Error saving model", e);
            throw new ActivitiException("Error saving model", e);
        }
    }



    /**
     * 保存模型
     *
     * @param modelId
     * @param values
     */
    public void saveModelXml(@PathVariable String modelId,
                             @RequestBody Map<String, String> values) {
        //ByteArrayOutputStream outStream = null;
        try {


            Model model = repositoryService.getModel(modelId);
            // 获取模型信息
            ObjectNode modelJson = (ObjectNode) objectMapper
                    .readTree(model.getMetaInfo());
            // 获取value第一个元素
            modelJson.put(MODEL_NAME, model.getName());
            modelJson.put(MODEL_DESCRIPTION, modelJson.get("description"));
            model.setMetaInfo(modelJson.toString());
            // 版本
            model.setVersion(model.getVersion() + 1);
            repositoryService.saveModel(model);
            String bpmnXml = BpmnConverterUtil
                    .converterXmlToJson(values.get("bpmn_xml")).toString();
            repositoryService.addModelEditorSource(model.getId(), bpmnXml.getBytes("utf-8"));

            repositoryService.addModelEditorSourceExtra(model.getId(),
                    values.get("svg_xml").getBytes("utf-8"));

        } catch (Exception e) {
            //LOG.error("Error saving model", e);
            System.out.println("Error saving model");
            throw new ActivitiException("Error saving model", e);
        }
    }


}

